package com.lhkj.ct.meta.admin.service;

import com.lhkj.ct.base.model.LoginUser;
import com.lhkj.ct.base.model.Option;
import com.lhkj.ct.base.mybatis.extension.service.IService;
import com.lhkj.ct.meta.admin.model.entity.TblMenu;
import com.lhkj.ct.meta.admin.model.vo.MenuVo;
import com.lhkj.ct.meta.admin.model.vo.RouterVo;
import org.hibernate.validator.constraints.Range;
import org.springframework.validation.annotation.Validated;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Set;

/**
 * <p>
 *  服务类
 * </p>
 *
 * @author jobob
 * @since 2023-08-22
 */
@Validated
public interface SysMenuService extends IService<TblMenu> {

    /**
     * 保存菜单
     *
     * @param menu
     * @return
     */
    int saveMenu(TblMenu menu);

    /**
     * 修改菜单显示状态
     *
     * @param menuId 菜单ID
     * @param visible 是否显示(1->显示；2->隐藏)
     * @return
     */
    boolean updateMenuVisible(@NotBlank(message = "菜单id不能为空") String menuId,
                              @NotNull(message = "状态不能为null") @Range(min = 0, max = 1, message = "状态参数不合法") Integer visible);

    /**
     * 删除菜单
     *
     * @param id
     * @return
     */
    int deleteMenu(@NotBlank(message = "菜单id不能为空") String id);

    /**
     * 获取菜单表格列表
     *
     * @return
     */
    List<MenuVo> listMenus(@NotNull(message = "TblMenu不能为null") TblMenu queryParams);

    /**
     * 获取菜单下拉列表
     *
     * @return
     */
    List<Option<String>> listMenuOptions();

    /**
     * 获取路由列表
     *
     * @return
     */
    List<RouterVo> getRoutesByLoginUser();

    /**
     * 获取登录用户权限
     *
     * @param   user
     */
    Set<String> getPermsByUserId(LoginUser user);


//    /**
//     * 获取角色权限集合
//     *
//     * @param roles
//     * @return
//     */
//    Set<String> getPermsByUserId(Set<String> roles);


    /**
     * 是否存在菜单子节点
     *
     * @param menuId 菜单ID
     * @return 结果 true 存在 false 不存在
     */
    boolean hasChildByMenuId(String menuId);

    /**
     * 查询菜单是否存在角色
     *
     * @param menuId 菜单ID
     * @return 结果 true 存在 false 不存在
     */
    boolean checkMenuExistRole(String menuId);
}
